package com.hspedu.tankgame5;


import java.util.Vector;

/**
 * @author LiuJinTao
 * @className Enemy
 * @date 2024/06/21 9:38
 * @description 敌人坦克
 */
public class Enemy extends Tank implements Runnable {
    // 定义一个 Shot 对象，表示一个射击（线程）
    Shot shot = null;
    Vector<Shot> shots = new Vector<>();
    // 增加成员，该坦克可以得到敌人坦克的 Vector
    Vector<Enemy> enemies = new Vector<>();

    public void setEnemies(Vector<Enemy> enemies) {
        this.enemies = enemies;
    }

    // 编写方法，判断当前的这个敌人坦克，是否和 enemies 中的其他坦克发生了重叠或者是碰撞
    public boolean isTouchEnemy() {
        // 判断当前敌人坦克方向
        switch (getDirect()) {
            case 0:
                for (int i = 0; i < enemies.size(); i++) {
                    // 取出一个敌人坦克
                    Enemy enemy = enemies.get(i);
                    // 不和自己比较
                    if (enemy != this) {
                        //如果敌人坦克是上或者下
                        if (enemy.getDirect() == 0 || enemy.getDirect() == 2) {
                            if ((getX() >= enemy.getX() && getX() <= enemy.getX()+40 && getY() >= enemy.getY() && getY() <= enemy.getY()+60) || (getX()+40 >= enemy.getX() && getX()+40 <= enemy.getX()+40 && getY() >= enemy.getY() && getY() <= enemy.getY()+60)) {
                                return true;
                            }
                        } else {//如果敌人坦克是右或者左
                            if ((getX() >= enemy.getX() && getX() <= enemy.getX()+60 && getY() >= enemy.getY() && getY() <= enemy.getY()+40) || (getX()+40 >= enemy.getX() && getX()+40 <= enemy.getX()+60 && getY() >= enemy.getY() && getY() <= enemy.getY()+40)) {
                                return true;
                            }
                        }
                    }
                }
                break;
            case 1:
                for (int i = 0; i < enemies.size(); i++) {
                    // 取出一个敌人坦克
                    Enemy enemy = enemies.get(i);
                    // 不和自己比较
                    if (enemy != this) {
                        //如果敌人坦克是上或者下
                        if (enemy.getDirect() == 0 || enemy.getDirect() == 2) {
                            if ((getX()+60 >= enemy.getX() && getX()+60 <= enemy.getX()+40 && getY() >= enemy.getY() && getY() <= enemy.getY()+60) || (getX()+60 >= enemy.getX() && getX()+60 <= enemy.getX()+40 && getY()+40 >= enemy.getY() && getY()+40 <= enemy.getY()+60)) {
                                return true;
                            }
                        } else {//如果敌人坦克是右或者左
                            if ((getX()+60 >= enemy.getX() && getX()+60 <= enemy.getX()+60 && getY() >= enemy.getY() && getY() <= enemy.getY()+40) || (getX()+60 >= enemy.getX() && getX()+60 <= enemy.getX()+60 && getY()+40 >= enemy.getY() && getY()+40 <= enemy.getY()+40)) {
                                return true;
                            }
                        }
                    }
                }
                break;
            case 2:
                for (int i = 0; i < enemies.size(); i++) {
                    // 取出一个敌人坦克
                    Enemy enemy = enemies.get(i);
                    // 不和自己比较
                    if (enemy != this) {
                        //如果敌人坦克是上或者下
                        if (enemy.getDirect() == 0 || enemy.getDirect() == 2) {
                            if ((getX() >= enemy.getX() && getX() <= enemy.getX()+40 && getY()+60 >= enemy.getY() && getY()+60 <= enemy.getY()+60) || (getX()+40 >= enemy.getX() && getX()+40 <= enemy.getX()+40 && getY()+60 >= enemy.getY() && getY()+60 <= enemy.getY()+60)) {
                                return true;
                            }
                        } else {//如果敌人坦克是右或者左
                            if ((getX() >= enemy.getX() && getX() <= enemy.getX()+60 && getY()+60 >= enemy.getY() && getY()+60 <= enemy.getY()+40) || (getX()+40 >= enemy.getX() && getX()+40 <= enemy.getX()+60 && getY()+60 >= enemy.getY() && getY()+60 <= enemy.getY()+40)) {
                                return true;
                            }
                        }
                    }

                }
                break;
            case 3:
                for (int i = 0; i < enemies.size(); i++) {
                    // 取出一个敌人坦克
                    Enemy enemy = enemies.get(i);
                    // 不和自己比较
                    if (enemy != this) {
                        //如果敌人坦克是上或者下
                        if (enemy.getDirect() == 0 || enemy.getDirect() == 2) {
                            if ((getX() >= enemy.getX() && getX() <= enemy.getX() + 40 && getY() >= enemy.getY() && getY() <= enemy.getY() + 60) || (getX() >= enemy.getX() && getX() <= enemy.getX() + 40 && getY() + 40 >= enemy.getY() && getY() + 40 <= enemy.getY() + 60)) {
                                return true;
                            }
                        } else {//如果敌人坦克是右或者左
                            if ((getX() >= enemy.getX() && getX() <= enemy.getX() + 60 && getY() >= enemy.getY() && getY() <= enemy.getY() + 40) || (getX() >= enemy.getX() && getX() <= enemy.getX() + 60 && getY() + 40 >= enemy.getY() && getY() + 40 <= enemy.getY() + 40)) {
                                return true;
                            }
                        }
                    }
                }
                break;
        }
        return false;
    }

    public Enemy(int x, int y) {
        super(x, y);
    }


    public void shotBullet() {
        // 创建 Shot 对象，根据当前 tank 的位置和方向创建子弹位置
        switch (getDirect()) {
            case 0:// 向上
                shot = new Shot(getX()+20, getY(), 0);
                break;
            case 1:// 向右
                shot = new Shot(getX()+60, getY()+20, 1);
                break;
            case 2:// 向下
                shot = new Shot(getX()+20, getY()+60, 2);
                break;
            case 3:// 向左
                shot = new Shot(getX(), getY()+20, 3);
                break;
        }
        shots.add(shot);
        new Thread(shot).start();
    }

    @Override
    public void run() {
        int count = 0;
        while (true) {
            // 根据坦克的方向继续移动
            switch (getDirect()) {
                case 0:
                    if (!isTouchEnemy() && getY() != 0) {
                        moveUp();
                    } else {
                        count = 0;
                        setDirect((int)(Math.random()*4));
                    }
                    break;
                case 1:
                    if (!isTouchEnemy() && getX() != 1000) {
                        moveRight();
                    } else {
                        count = 0;
                        setDirect((int)(Math.random()*4));
                    }
                    break;
                case 2:
                    if (!isTouchEnemy() && getY() != 750) {
                        moveDown();
                    } else {
                        count = 0;
                        setDirect((int)(Math.random()*4));
                    }
                    break;
                case 3:
                    if (!isTouchEnemy() && getX() != 0) {
                        moveLeft();
                    } else {
                        count = 0;
                        setDirect((int)(Math.random()*4));
                    }
                    break;
            }

            try {
                Thread.sleep(50);
                count++;
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

            // 随机改变坦克方向
            if (count == 30) {
                setDirect((int)(Math.random()*4));
                count = 0;
            }


            // 退出线程
            if (!isLive) break;
        }
    }
}
